<?php
require '../dao/location_dao.php';
$keyword=$_GET["keyword"];
$table=$_GET["table"];
find($keyword, $table);

function find($text, $table){
  $result = array();
  $tokens = scws($text);
  // print_r($tokens);
  foreach ($tokens as $t) {
    $r = query($t, $table);
    if($r !== []){
        $result = merge($result, $r, $t);//合并结果
    }
  }
  uasort($result, "sortByRate");//对结果排序
  $php_json = json_encode($result);  //把php数组格式转换成 json 格式的数据
  echo "01".$php_json;
}

function merge($total, $new, $qt){//【参数说明】：总结果数组，按当前查询词查出来的结果数组，当前查询词
  foreach ($new as $key => $value) {
    if(array_key_exists($key, $total)){//如果已经被查出来过，则合并
      if(!array_key_exists($qt, $total[$key]->getQueryText())){
        $total[$key]->addQueryText($qt);
        /*重新汇总匹配的查询词*/
        $len = 0;
        foreach ($total[$key]->getQueryText() as $key1 => $value1){
            $len += strlen($key1);
        }
        $newRate = (double)$len / strlen($key);
        $total[$key]->setRate($newRate);//更新匹配度
      }
    }else{
      $total[$key] = $value;
    }
  }
  return $total;
}

function sortByRate($_1, $_2){
  if($_1->getRate() == $_2->getRate()){
    return 0;
  }else{
    return $_1->getRate() > $_2->getRate() ? -1 : 1;//降序排序
  }
}

function scws($text) {
  error_reporting(E_ALL & ~(E_STRICT | E_NOTICE));
    // 加入头文件
  require '../pscws4/pscws4.class.php';

  // 建立分词类对像, 参数为字符集, 默认为 gbk, 可在后面调用 set_charset 改变
  $pscws = new PSCWS4();

  //
  // 接下来, 设定一些分词参数或选项, set_dict 是必须的, 若想智能识别人名等需要 set_rule
  //
  // 包括: set_charset, set_dict, set_rule, set_ignore, set_multi, set_debug, set_duality ... 等方法
  //
  $pscws->set_charset('utf-8');
  $pscws->set_dict('../pscws4/dict/dict.utf8.xdb');
  $pscws->set_rule('../pscws4/etc/rules.utf8.ini');
  $pscws -> set_ignore(true);
  /*
   说明：设定分词返回结果时是否复合分割，如“中国人”返回“中国＋人＋中国人”三个词。
   返回：无。
   参数：mode 设定值，1 ~ 15。
   按位异或的 1 | 2 | 4 | 8 分别表示: 短词 | 二元 | 主要单字 | 所有单字
  */
  $pscws -> set_multi(3);
  // 分词调用 send_text() 将待分词的字符串传入, 紧接着循环调用 get_result() 方法取回一系列分好的词
  // 直到 get_result() 返回 false 为止
  // 返回的词是一个关联数组, 包含: word 词本身, idf 逆词率(重), off 在text中的偏移, len 长度, attr 词性
  //

  $pscws->send_text($text);
  $result = null;
  while ($some = $pscws->get_result())
  {
   foreach ($some as $word)
   {
     $result[] = $word["word"];
   }
  }

  // 在 send_text 之后可以调用 get_tops() 返回分词结果的词语按权重统计的前 N 个词
  // 常用于提取关键词, 参数用法参见下面的详细介绍.
  // 返回的数组元素是一个词, 它又包含: word 词本身, weight 词重, times 次数, attr 词性
  // $tops = $pscws->get_tops(10, 'n,v');
  // print_r($tops);
  return $result;
}
 ?>
